<?php 

define(__SOURCE__,'http://mfcmf.googlecode.com/files/');
define(__DUMP_DEFALUT__,'db-for-utf8.sql.zip');
define(__PACKAGE__,'cms.zip');

$cur_dir = realpath('./../');

$temp_package_name = 'temp.zip';

$system_dirs = array('application','config','data','library','tmp');


if (isset($_POST['install_step'])) {
	$db_host = $_POST['host_db'];
	$db_name = $_POST['name_db'];
	$db_user = $_POST['user_db'];
	$db_pass = $_POST['password_db'];

	$errors = array();
	
	
	if (trim($db_host)=="") {
		$errors[] = "Не указан хост MySQL."; 
	} elseif (trim($db_user)=="") {
		$errors[] = "Не указан пользователь MySQL."; 
	} elseif (trim($db_name)=="") {
		$errors[] = "Не указано имя базы MySQL."; 
	} else {	
		$db_link = mysqli_connect($db_host,$db_user,$db_pass,$db_name);
		if ( !$db_link ) {
			switch (mysqli_connect_errno()) {
				case 2005:
					$errors[] = "Хост MySQL не найден ($db_host).";
					break;
				case 2002:
					$errors[] = "Проблемы при подключении к MySQL ($db_host).";
					break;
				case 1045:
					$errors[] = "Неверный логин или пароль пользователя MySQL ($db_user).";
					break;
				case 1044:
					$errors[] = "Проблемы при подключении к  MySQL ($db_name).";
					break;
				default:
					$errors[] = "Ошибка при подключении к MySQL.";
					break;
			}
		}
	}


	if ($_POST['install_step']=='1') {
		
		$work_dir = $_POST['work_dir'];
		$public_dir = $_POST['public_dir'];
	
		/*
		1. Тестирование возможности записи в указанную директорию.
		2. Тестирование возможности работы с БД.
		3. Тестирование наличия в сети пакета с установкой.
		*/
		
		if ( !file_exists ($public_dir) ) {
			$errors[] = "Не существует директории $public_dir. Сначала создайте ее на сервере.";
		} elseif (!is_writable ($public_dir)) {
			$errors[] = "Невозможно произвести запись в $public_dir. Измените права на запись.";
		}
		
		if ( !file_exists ($work_dir) ) {
			$errors[] = "Не существует директории $work_dir. Сначала создайте ее на сервере.";
		} elseif (!is_writable ($work_dir)) {
			$errors[] = "Невозможно произвести запись в $work_dir. Измените права на запись.";
		} else {
			$is_work_subdirs = false; 
			$work_subdirs = scandir($work_dir);
			foreach ($work_subdirs as $work_subdir) {
				if (in_array($work_subdir,$system_dirs)) {
					$errors[] = "Директория для рабочих файлов содежит '$work_subdir' ($work_dir)."; 
				}
			}
		}
		
		
		/*
		1. Скачиваем файл с архивом.
		2. Распаковываем его в соответсвии с директориями указанными пользователем.
		3. Формируем конфиг.
		4. Изменяем путь в application из index.php
		5. Устанавливаем БД по умолчанию.
		6. Накатываем демо сайт
		*/
		if (count($errors)==0) {
			$zip_file = "$cur_dir/$temp_package_name";
			
			copy(__SOURCE__ . __PACKAGE__, $zip_file);
			
			extractZip($zip_file,$cur_dir);
		
			
			if (!file_exists($work_dir)) {
				mkdir($work_dir);
			}
			
			$work_dir = realpath ($work_dir);
			
			if ($cur_dir!=$work_dir) {
				foreach ($system_dirs as $system_dir) {
					rename("$cur_dir/$system_dir","$work_dir/$system_dir");
				}
			}
			
			
			if (!file_exists($public_dir)) {
				mkdir($public_dir);
			}
			
			$public_dir = realpath ($public_dir);
			$public_subdirs = scandir("$cur_dir/public");
			foreach ($public_subdirs as $public_subdir) {
				if ($public_subdir!='.' && $public_subdir!='..') {
					rename("$cur_dir/public/$public_subdir","$public_dir/$public_subdir");
				}
			}
			
			unlink("$cur_dir/public");
			
			unlink($zip_file);
			
			
			$cfg_file = "$work_dir/config/config.ini.example";
			$cfg = fopen($cfg_file,'r');
			$cfg_content = fread($cfg,filesize($cfg_file));
			fclose($cfg);
			
			$cfg_content = str_replace('/usr/home/your_project/public',$public_dir,$cfg_content);
			$cfg_content = str_replace('/usr/home/your_project',$work_dir,$cfg_content);
			$cfg_content = str_replace('db.params.host = ',"db.params.host = $db_host",$cfg_content);
			$cfg_content = str_replace('db.params.username = ',"db.params.username = $db_user",$cfg_content);
			$cfg_content = str_replace('db.params.password = ',"db.params.password = $db_pass",$cfg_content);
			$cfg_content = str_replace('db.params.dbname = ',"db.params.dbname = $db_name ",$cfg_content);
			
			$cfg2 = fopen("$work_dir/config/config.ini",'w');
			fwrite($cfg2,$cfg_content);
			fclose($cfg2);
			
			$idx_file = "$public_dir/index.php";
			$idx_content = file_get_contents($idx_file);
			$idx_content = str_replace('../application',relativePath($public_dir,$work_dir).'/application',$idx_content);
			file_put_contents($idx_file,$idx_content);
			
			
			// Dump
			copy(__SOURCE__ . __DUMP_DEFALUT__ , $zip_file);
			
			extractZip($zip_file,$cur_dir);
			
			$db_dump_sql = file_get_contents("$cur_dir/dump.sql");
			mysqli_multi_query($db_link,$db_dump_sql);
			
			unlink($zip_file);
			unlink("$cur_dir/dump.sql");
			
		}
	} elseif ($_POST['install_step']=='2') {
		if (count($errors)>0) {
			header("Location: ". basename (__FILE__));
			die();
		}
		
		$pass1 = trim($_POST['pass1']);
		$pass2 = trim($_POST['pass2']);
		if ($pass1=='') {
			$errors[] = 'Вы не указали пароль.';
		} elseif ($pass2=='' || $pass1!=$pass2) {
			$errors[] = 'Вы не подтвердили пароль.';
		} else {
			mysqli_query($db_link,"UPDATE `cms_administrator` SET `password`=MD5('".mysqli_real_escape_string($pass1)."') WHERE `administrator_id`=1");
		}
	}
	
	if ($db_link) {
		mysqli_close($db_link);
	}
}


function relativePath($from, $to, $ps = DIRECTORY_SEPARATOR)
{
  $arFrom = explode($ps, rtrim($from, $ps));
  $arTo = explode($ps, rtrim($to, $ps));
  while(count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0]))
  {
    array_shift($arFrom);
    array_shift($arTo);
  }
  return str_pad("", count($arFrom) * 3, '..'.$ps).implode($ps, $arTo);
}

function extractZip( $zipFile = '', $dirFromZip = '' )
{    
    define(DIRECTORY_SEPARATOR, '/');

    $zipDir = ($dirFromZip=='' ? getcwd() :$dirFromZip ) . DIRECTORY_SEPARATOR;
    $zip = zip_open($zipFile);

    if ($zip)
    {
        while ($zip_entry = zip_read($zip))
        {
            $completePath = $zipDir . dirname(zip_entry_name($zip_entry));
            $completeName = $zipDir . zip_entry_name($zip_entry);
            // Walk through path to create non existing directories
            // This won't apply to empty directories ! They are created further below
            if(!file_exists($completePath) /*&& preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) */)
            {
                $tmp = '';
                foreach(explode('/',$completePath) AS $k)
                {
                    $tmp .= $k.'/';
                    if(!file_exists($tmp) )
                    {
                        @mkdir($tmp, 0777);
                    }
                }
            }
            
            if (zip_entry_open($zip, $zip_entry, "r"))
            {
                if( true /*preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) )*/ )
                {
                    if ($fd = @fopen($completeName, 'w+'))
                    {
                        fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                        fclose($fd);
                    }
                    else
                    {
                        // We think this was an empty directory
                        mkdir($completeName, 0777);
                    }
                    zip_entry_close($zip_entry);
                }
            }
        }
        zip_close($zip);
    }
    return true;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php if (count($errors)>0) :?>
<p style="color:red"><?= implode("<br />",$errors) ?></p>
<?php endif; ?>

<?php if (!isset($_POST['install_step']) || ($_POST['install_step']=='1' &&  count($errors)>0) ) : ?>
<form id="form1" name="form1" method="post" action="">
  <input type="hidden" name="install_step" value="1" />
  <p>Текущая директория: <?= $cur_dir ?>
</p>
  <p>Директория для публичных файлов: 
    <input type="text" name="public_dir" id="public_dir" value="<?= !isset($_POST['install_step']) ? $cur_dir : $public_dir ?>" />
  .</p>
  <p>Директория для рабочих файлов: 
    <input type="text" name="work_dir" id="work_dir" value="<?= !isset($_POST['install_step']) ? $cur_dir : $work_dir ?>" />
  </p>
  <p>База данных</p>
  <p>Хост: 
    <input type="text" name="host_db" id="host_db" value="<?= !isset($_POST['install_step']) ? 'localhost' : $db_host ?>" />
  </p>
  <p>Имя базы: 
    <input type="text" name="name_db" id="name_db" value="<?= $db_name ?>" />
  </p>
  <p>Пользователь: 
    <input type="text" name="user_db" id="user_db" value="<?= !isset($_POST['install_step']) ? 'root' : $db_user ?>" />
  </p>
  <p>Пароль: 
    <input type="password" name="password_db" id="password_db" />
  </p>
  <p>
    <input type="submit" value="Далее" />
  </p>
</form>
<?php elseif (($_POST['install_step']=='1' && count($errors)==0) || ($_POST['install_step']=='2' && count($errors)>0)):?>
<form id="form1" name="form1" method="post" action="">
  <input type="hidden" name="install_step" value="2" />
  <input type="hidden" name="host_db" value="<?= $db_host ?>" />
  <input type="hidden" name="name_db" value="<?= $db_name ?>" />
  <input type="hidden" name="user_db" value="<?= $db_user ?>" />
  <p>Установка пароля администратора.</p>
  <p>Введите пароль:
    <input type="password" name="pass1" />
  </p>
  <p>Повторите пароль:
    <input type="password" name="pass2" />
  </p>
  <p>
    <input type="submit" value="Далее" />
  </p>
</form>
<?php elseif ($_POST['install_step']=='2' && count($errors)==0): ?>
<p>Установка завешена. Обязательно удалите директорию &quot;install&quot;.</p>
<?php endif; ?>
</body>
</html>
